home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagg_m.zip / MEMORY.SWG / 0042_Linear Memory 2.pas < prev    next >
Pascal/Delphi Source File  |  1994-01-27  |  2KB  |  40 lines

  1. {
  2. > Does anyone know how to access memory linearly as to do away with the
  3. > Segment:Offset standard? I've seen it done in a program called VOC 386
  4. > yet it doesn't switch to protected mode(at least I'm pretty sure...)
  5.  
  6. > I need to load digital samples >64k and have a means of addressing them
  7. > with having to worry about crossing segment boundries and conventional
  8. > memory just won't suffice... Any help would be appreciated...
  9.  
  10. You just need to trick GetMem into allocating the memory sequentially, and as
  11. long as you're in v86 mode it should wrap your indexes on to the next chunk of
  12. memory if you use 32-bit addressing
  13. }
  14. getMem(p1,32768);
  15. getMem(p2,32768);
  16. getMem(p3,32768);
  17. if (seg(p2^)-seg(p1^)<>$800)or(seg(p3^)-seg(p2^)<>$800) then exit;
  18.                            {not seqential! They must be sequential!!} if
  19. (ofs(p1^)<>0)or(ofs(p2^)<>0)or(ofs(p3^)<>0) then exit;
  20.                            {keep them at zero offset also} {all that is a
  21. little drastic (exiting and such) but you must somehow make sure they're truly
  22. linear, at least according to your virtual 8086 machine.}
  23. {
  24. Now you need 386 assembly which pascal's BASM can't handle, but I'll post some
  25. here anyway.
  26. }
  27. asm
  28.  db $66; xor si,si           {xor esi,esi}
  29.  push ds
  30.  mov ds,word ptr p1+2
  31.  db $66; mov cx,32768; dw 1  {mov ecx,$18000}
  32.  db $67; rep lodsb         {get bytes using extended 32-addressing (ds:esi)}
  33.  pop ds
  34.  end;
  35. {
  36. although this doesn't actually do anything with the data, it does access it.
  37. (or should, this hasn't been tested yet)
  38. }
  39.  
  40.